//
//  DLMainViewController.swift
//  新浪微博
//
//  Created by 周冰烽 on 2016/12/30.
//  Copyright © 2016年 周冰烽. All rights reserved.
//

import UIKit

/// 主控制器
class DLMainViewController: UITabBarController {
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupChildControllers()
        setupComposeButton()
    }
    
    /// portrait    :竖屏,肖像
    /// landscape   :横屏,风景画
    
    /// 使用代码控制设备的方向,好处,可以在需要横屏的时候,单独处理
    
    /// 设置支持的方向之后,当前的控制器及子控制器都会遵守这个方向
    
    /// 如果播放视频,通常是通过 modal 展现的!
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
    
    
    // MARK: - 私有控件
    //撰写按钮
    fileprivate lazy var composeButton:UIButton =
        UIButton.cz_imageButton("tabbar_compose_icon_add",
                                backgroundImageName: "tabbar_compose_button")
    
    
    
}
// MARK: - 中间按钮
private extension DLMainViewController {
    // MARK: - 监听方法
    /**
     撰写微博
     FIXME:没有实现
     */
    //@objc 允许这个函数在'运行时'能够被访问
    @objc func composeStatus() {
        print("撰写微博")
        //测试方向旋转
        let vc = UIViewController()
        vc.view.backgroundColor = UIColor.cz_random()
        let nav = UINavigationController(rootViewController:vc)
        present(nav, animated: true, completion: nil)
        
        
    }
    /**
     设置撰写按钮
     */
    func setupComposeButton() {
        //'composeButton' is inaccessible due to 'private' protection level
        tabBar.addSubview(composeButton)
        //计算按钮的宽度
        let count = CGFloat(childViewControllers.count)
        //将向内缩进的宽度减少,能让按钮的宽度变大,盖住容错点,防止穿帮
        let w = tabBar.bounds.width / count - 1
        //整数向内缩进,负数向外扩展
        composeButton.frame = tabBar.bounds.insetBy(dx: 2 * w, dy: 0)
        //按钮监听方法
        composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)
        
    }
}

//extension 类似于OC中的 分类,在Swift中还可以用来切分代码块
//可以把相近功能的函数, 放在一个 extention 中
//便于代码维护
//注意:和OC的分类一样,extention中不能定义属性
// MARK: - 设置界面
private extension DLMainViewController {
    
    /// 所有子控制器
    func setupChildControllers() {
        //0.获取沙盒 json 路径
        let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let jsonPath = (docDir as NSString).appendingPathComponent("main.json")
        
        //加载data
        var data = NSData(contentsOfFile: jsonPath)
        //判断data是否有内容,如果没有,说明本地沙盒没有文件
        if data == nil {
            //从Bundle加载
            let path = Bundle.main.path(forResource: "main.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
        }
        //data 一定会有一个内容,反序列化
        
        //反序列化转换成数组
        guard let array = try? JSONSerialization.jsonObject(with: data! as Data, options: []) as? [[String:AnyObject]] else {
            return
        }
        // 遍历数组,循环创建控制器数组
        var arrayM = [UIViewController]()
        for dict in array! {
            arrayM.append(controller(dict: dict))
        }
        //设置TabBar 的 自控制器
        viewControllers = arrayM
        
    }
    /**
     使用字典创建一个子控制器
     
     - parameter dict: 信息字典[clsName,title,imageName,visitorInfo]
     
     - returns: 自控制器
     */
    func controller(dict :[String: AnyObject]) -> UIViewController {
        //1.取得字典内容
        guard let clsName = dict["clsName"] as? String else {
            return UIViewController()
        }
        guard let title = dict["title"] as? String else {
            return UIViewController()
        }
        guard let imageName = dict["imageName"] as?String else {
            return UIViewController()
        }
        guard let cls = NSClassFromString(Bundle.main.namespace + "." + clsName) as? DLBaseViewController.Type
            else {
                return UIViewController()
        }
        guard let visitorInfo = dict["visitorInfo"] as?[String:String] else {
            return UIViewController()
        }
        //2.创建视图控制器
        //1->将clsName 转换成 cls
        let vc = cls.init()
        vc.title = title
        
        //设置控制器的访客信息字典
        vc.visitorInfoDict = visitorInfo
        
        //2->设置图像
        vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName)
        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_selected")?.withRenderingMode(.alwaysOriginal)
        //3->设置tabbar的标题字体(大小)
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName:UIColor.orange], for: .selected)
        //系统默认是12号字,修改字体大小,要设置normal 的字体大小
        vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName:UIFont.systemFont(ofSize: 12)], for: UIControlState(rawValue: 0))
        //实例化导航控制器的时候,会调用 push 方法将 rootVC 压栈
        let nav = DLNavigationController(rootViewController: vc)
        
        return nav
        
    }
    
    
    
    
    
    
}









